package modules

import (
	"embed"
	"fmt"
	"io"
	"log"
	"os"
	"path/filepath"
	"strings"

	"gopkg.in/yaml.v3"
)

var config Config
var embedAssets embed.FS

// 工作目录
func getWorkDir() string {
	basePath, err := os.Getwd()
	if err != nil {
		log.Fatalf("获取当前工作目录失败: %v", err)
	}
	abspath, _ := filepath.Abs(basePath)
	return abspath
}

var workDir = getWorkDir()

// 在全局变量区域添加
var userHtmlTemplate string

var rootNames map[string]string = map[string]string{}

// initLogging 初始化日志
func initLogging() {
	fmt.Println("初始化日志...")
	logDir := filepath.Join(workDir, "lightshare-logs")

	if !CreateDirectory(logDir, nil) {
		os.Exit(1)
		return
	}

	logFileName := filepath.Join(logDir, "app.log")
	logFile, err := os.OpenFile(logFileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)
	if err != nil {
		fmt.Printf("打开日志文件失败: %v\n", err)
		os.Exit(1)
	}
	fmt.Printf("日志文件: %s\n", logFileName)
	fmt.Println("设置日志输出...")
	log.SetOutput(io.MultiWriter(logFile, os.Stdout))

	// logFile.Close()
	// log.SetOutput(&lumberjack.Logger{
	// 	Filename:   logFileName,
	// 	MaxSize:    100, // 单个日志文件最大尺寸（MB）
	// 	MaxBackups: 30,  // 最多保留的旧日志文件数
	// 	MaxAge:     30,  // 日志文件最多保留天数，每月滚动可通过 MaxBackups 结合每月生成新文件来近似实现
	// 	Compress:   true, // 压缩旧日志文件
	// })

	log.Println("日志初始化完成")
}

// createConfigFile 自动创建配置文件
func createConfigFile() {
	configFile := filepath.Join(workDir, "lightshare.yaml")
	if _, err := os.Stat(configFile); err == nil {
		return
	}
	log.Println("配置文件不存在，自动生成...")
	defaultConfig := `server:
  host: 127.0.0.1
  port: 80
root_dirs:
  # - /path/to/share
allowed_extensions:
  # Uncomment and add extensions as needed
  # - txt
  # - pdf
  # - png
  # - jpg
  # - jpeg
  # - gif
temp:
  enabled: false
  path: /path/to/temp
`
	if err := os.WriteFile(configFile, []byte(defaultConfig), 0644); err != nil {
		log.Fatalf("创建默认配置文件时出错: %v", err)
	}
	log.Println("默认配置文件创建成功")
}

// readConfig 读取配置文件
func readConfig() {
	configFile := filepath.Join(workDir, "lightshare.yaml")
	if _, err := os.Stat(configFile); os.IsNotExist(err) {
		log.Fatal("配置文件 lightshare.yaml 不存在，重新启动以自动创建配置文件")
	}
	data, err := os.ReadFile(configFile)
	if err != nil {
		log.Fatalf("读取配置文件时出错: %v", err)
	}
	if err := yaml.Unmarshal(data, &config); err != nil {
		log.Fatalf("解析配置文件时出错: %v", err)
	}
	log.Println("配置文件读取成功")
	log.Printf("配置文件内容: %s", string(data))
}

// initAppName 初始化应用名称
func initAppName(appInfo APPConfig) {
	data, err := GetAssetContent("index.html")
	if err != nil {
		log.Fatalf("读取 assets/index.html 失败: %v", err)
	}
	appName := "轻共享"
	if name := appInfo.Name; name != "" {
		appName = name
	}

	userHtmlTemplate = strings.ReplaceAll(string(data), "{APP_NAME}", appName)
}

// initRootNames 获取根目录名称映射
func initRootNames() {
	if len(config.RootDirs) == 0 {
		log.Fatal("根目录配置为空，必须在 lightshare.yaml 中配置一个根目录")
	}
	for _, rootDir := range config.RootDirs {
		// 检查根目录是否存在
		if _, err := os.Stat(rootDir); os.IsNotExist(err) {
			log.Fatalf("配置的根目录 %s 不存在，请检查配置文件", rootDir)
		}
		dirName := filepath.Base(rootDir)
		if _, exists := rootNames[dirName]; exists {
			log.Fatalf("重复的根目录名称: %s", dirName)
		}
		rootNames[dirName] = rootDir
	}
	log.Println("根目录名称映射创建成功")
}

// DoInit 初始化操作
func DoInit(assets embed.FS) Config {
	embedAssets = assets
	initLogging()
	createConfigFile()
	readConfig()
	initAppName(config.App)
	initRootNames()
	log.Printf("程序初始化完成，工作目录为: %s", workDir)
	return config
}
